今日課程的概念在程式設計過程扮演非常重要的角色,有許多應用程式發生錯誤導致 crash,部分的主因與 Null 安全性有很大的關係,在 Kotlin 中宣告變數預設是無法指定 null 的,但在實務上進行程式設計時,有很多情境都需要用到空值的概念,這時可用 nullable 符號 ?
,來進行宣告:
將 null 變數直接列出來時,雖然在 console 看到的是 null 但它是實實在在的空值,不等於字串 "null"。
讀者不妨一邊開著線上昨日提到的 IDE 網站,一邊跟著圖片內容動手試試。
一旦使用了 nullable 後,就必須格外小心處理該變數,通常 IDE 會幫你檢查潛在的陷阱,例如在處理字串長度時使用 .length
,但空值是沒有長度的,因此編輯器會警告你不要做傻事!
那該如何處理 nullable 呢?有一種是強迫性的威脅 IDE 說:我很確定最終使用這個變數時,它不會是 null,我 100% 保證,你不用替我擔心沒關係。這時就可在變數後加上 !!
兩個驚嘆號運算子,強制通過規則限制,同時你也要承擔萬一這個變數處理時仍是 null 就會導致程式崩潰的風險,一般來說並不建議隨意使用 !!
。
正確的處理方式有三種,各用法都有其適合的使用情境,第一種:應針對可為空值的變數進行特別判斷,以下圖解加入了函式一起示範,只要有使用 if
事先判斷值是否為 null,IDE 就會認可這種處理方式,不會顯示錯誤。
當進行程式設計,你需要一個普通變數是來自另一個 Nullable 變數時,在 Kotlin 中 ?:
不是其他程式的三元運算子 (C# => (int1 == null) ? -1 : int1.length;)
,取代 ?:
的用法是用單行 if...else
:
第二種方法是使用 safe calls 運算子 (一個問號 ?
表示),在變數後加上 => nullableStr?.length
,一般來說,.length
會傳回一般整數型態,加上了 ?
運算子後,會把整段回傳型態一起變成可為空值的整數型態,如下圖示範中,變數 a
承接的是正常型態的整數,所以若指定 null 值給 a
就會發生錯誤;變數 b
透過安全運算子變成 Int?
型態,之後也能繼續指定回 null。
第三種方法採用 ?:
運算子,代表著若前面的變數是 null 時,就指定一個 ?:
後面的值給它,(在 C# 會是使用兩個問號 ??
,反而 ?:
是另作它用,在上面的第一種方法有提到,作者表示頭痛),請看下圖說明,?:
其實就等於 if null...else
的寫法,可以想成是當空值時預設值的概念,注意這邊是用變數宣告當範例,並不代表只能用在變數宣告喔。
今日的學習就到這邊,由於這些概念都非常重要,在應用開發時使用的頻率很高,希望大家都能實際試試看各運算元的使用方式,避免將來的設計產生瑕疵。最近的程式語言介紹章節重點會在圖片上,其實作者花在圖片的時間比文字還多,盡可能地列出互相比較,讓大家比較能意會,希望有幫助,我們明天見!
資料參考
Null Safety - Kotlin Programming Language
https://kotlinlang.org/docs/reference/null-safety.html